package pl.practica5;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.antlr.runtime.ANTLRFileStream;
import org.antlr.runtime.ANTLRInputStream;
import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.CharStream;
import org.antlr.runtime.Token;


public class ListarTokens {
	
    public ListarTokens() {
    }

    public int fichero(String nombreFicheroEntrada) {
        int resultado = -1;
        try {
            CharStream cs = new ANTLRFileStream(nombreFicheroEntrada);
            FlexLexer lexer = new FlexLexer(cs);
            for (Token t = lexer.nextToken(); t.getType() != Token.EOF; t = lexer.nextToken())
                System.out.println(t);
            if (!lexer.hasErrors()) {
                System.out.print("\nAnalisis lexico correcto...");
                resultado = 0;
            }
            else {
                System.out.print("\nAnalisis lexico incorrecto...");
                resultado = 1;
            }
        } catch (IOException ioe) {
            System.out.print("Error fichero de entrada no encontrado: " + nombreFicheroEntrada);
            resultado = 2;
        }
        return resultado;
    }

    public int linea() {
        int resultado = -1;
        try {
            System.out.print("Introduzca la linea para el analisis lexico (ENTER + Ctrl+Z -> fin de entrada): ");
            ANTLRInputStream ais = new ANTLRInputStream(System.in);
            FlexLexer lexer = new FlexLexer(ais);
            for (Token t = lexer.nextToken(); t.getType() != Token.EOF; t = lexer.nextToken())
                System.out.println(t);
            if (!lexer.hasErrors()) {
                System.out.print("\nAnalisis lexico correcto...");
                resultado = 0;
            }
            else {
                System.out.print("\nAnalisis lexico incorrecto...");
                resultado = 1;
            }
        } catch (IOException ioe) {
            System.out.print("Error en el flujo de entrada: System.in");
            resultado = 2;
        }
        return resultado;
    }

    public int string() {
        int resultado = -1;
        try {
            System.out.print("Introduzca la linea para el analisis lexico (ENTER -> fin de entrada): ");
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(isr);
            String lineaAnalizar = br.readLine();
            CharStream cs = new ANTLRStringStream(lineaAnalizar);
            FlexLexer lexer = new FlexLexer(cs);
            for (Token t = lexer.nextToken(); t.getType() != Token.EOF; t = lexer.nextToken())
                System.out.println(t);
            if (!lexer.hasErrors()) {
                System.out.print("\nAnalisis lexico correcto...");
                resultado = 0;
            }
            else {
                System.out.print("\nAnalisis lexico incorrecto...");
                resultado = 1;
            }
        } catch (IOException ioe) {
            System.out.print("Error en el flujo de entrada: System.in");
            resultado = 2;
        }
        return resultado;
    }

    public void lineaAlinea() {
        try {
            System.out.print("Introduzca una linea o \"fin\" para terminar con el analisis lexico: ");
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(isr);
            ANTLRStringStream ass = null;
            FlexLexer lexer = null;
            for (String linea = br.readLine(); !linea.equals("fin"); linea = br.readLine()) {
                ass = new ANTLRStringStream(linea);
                lexer = new FlexLexer(ass);
                for (Token t = lexer.nextToken(); t.getType() != Token.EOF; t = lexer.nextToken())
                    System.out.println(t);
                if (!lexer.hasErrors())
                    System.out.println("\nAnalisis lexico correcto...\n");
                else {
                    System.out.println("\nAnalisis lexico incorrecto...\n");
                    lexer.errors.clear();
                }
                System.out.print("Introduzca una linea o \"fin\" para terminar con el analisis lexico: ");
            }
        } catch (IOException ioe) {
            System.out.print("Error en el flujo de entrada: System.in");
        }
    }

}